package com.atguigu.c_classinclass;
/*
    1. 在成员内部类中访问外部类成员 :
        a. 不同名的成员 : 直接访问
        b. 同名的成员 : Outer.this.成员

    2. 在外部类中访问内部类成员 :
        创建内部类对象 使用内部类对象去访问内部类成员

    3. 在第三方类中创建外部类对象 访问内部类成员 : 弄不了

    4. 在第三方类中创建内部类对象 访问内部类成员 :
        创建内部类对象 : Outer.Inner inner = new Outer().new Inner();
 */
public class Demo {
    public static void main(String[] args) {
        //创建外部类对象
        //Outer outer = new Outer();

        //创建内部类对象
        Outer.Inner inner = new Outer().new Inner();
        System.out.println("inner.num = " + inner.num);
        inner.method();

        System.out.println("inner.numIn = " + inner.numIn);
        inner.methodIn();

    }
}


class Outer{ //外部类
    int num = 111;
    int numOut = 222;
    public void method(){
        System.out.println("外部类的method");
    }

    public void methodOut(){
        System.out.println("methodOut");
    }

    //测试方法
    public void test(){
        //访问内部类成员 -> 内部类的成员属于内部类对象
        //创建内部类对象 使用内部类对象去访问内部类成员
        Inner inner = new Inner();
        System.out.println("inner.num = " + inner.num);
        inner.method();
    }

    //成员位置
    class Inner{ //成员内部类
        int num = 100;
        int numIn = 200;
        public void method(){
            System.out.println("内部类的method");
        }

        public void methodIn(){
            System.out.println("methodIn");
        }

        //测试方法
        public void test(){
            //外部类不同名的成员
            System.out.println("numOut = " + /*Outer.this.*/numOut);
            /*Outer.this.*/methodOut();
            //内部类自己的
            System.out.println("num = " + /*this.*/num);
            /*this.*/method();
            //外部类同名成员 : Outer.this.成员
            System.out.println("Outer.this.num = " + Outer.this.num);
            Outer.this.method();
        }
    }

}